#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>

//进程退出
void test1()
{
	//可以看到,进程退出码从0到133共134个,其中0就是我们一直为main函数设定的返回值
	// for(int i = 0 ; i<200 ; i++)
	// {
	// 	printf("%d->%s\n", i , strerror(i));
	// }


	//printf默认输出到库缓冲区,而\n除了回车换行外还可以刷新库缓冲区,exit()刷新库缓冲区而_exit没有这一步
	// //printf("start\n");
	// printf("start");
	// //sleep(2);
	// //_exit(1);
	// exit(1);
	// sleep(2);
	// printf("end\n");


	//如果程序于中途出现问题,则退出码无效,变成返回退出信号. 
	// int a = 4,b = 0;
	// printf("%d",a/b);

	//fopen("test.txt","r");

}

//进程等待(子进程退出,父进程不回收,僵尸状态)
void test2()
{
	pid_t ret = fork();
	if(ret == 0)
	{
		int count = 5;
		while(count--)
		{
			printf("我是子进程,pid是:%d ; 父进程的pid是:%d\n",getpid(),getppid());
			sleep(1);
		}
	}
	else
	{
		while(1)
		{
			printf("我是父进程 ,pid是:%d\n",getpid());
			sleep(1);
		}
	}
}

//进程等待,wait函数
void test3()
{
	pid_t ret = fork();
	if(ret == 0)
	{
		int count = 5;
		while(count--)
		{
			printf("我是子进程,pid是:%d ; 父进程的pid是:%d\n",getpid(),getppid());
			sleep(1);
		}
	}
	else
	{
		int count = 6;
		while(count--)
		{
			;
		}
		int id = 4;
			wait(&id);
			printf("子进程资源被回收,进程退出码是%d\n",id);
			printf("子进程资源被回收,进程退出码是%d\n",(id>>16)&0xFF);
	}
}

//进程等待,waitpid函数
void test4()
{
	pid_t ret = fork();
	if(ret == 0)
	{
		int count = 5;
		while(count--)
		{
			printf("我是子进程,pid是:%d ; 父进程的pid是:%d\n",getpid(),getppid());
			// int* p = 0;
			// *p = 45655;
			sleep(1);
		}
	}
	else
	{
		while(1)
		{
			int state = 4;
			//waitpid(-1, &state , 0); //阻塞等待,此时非得子进程运行结束后才能运行
			waitpid(-1, &state , WNOHANG); //非阻塞等待,变运行变执行自己的逻辑
			printf("父进程在偷偷干活!\n");
			sleep(1);
		}
	}
	
}
int main()
{
	
	//test1();
	//test2();
	//test3();
	test4();

	//return 160;
	return 0;
}
